package bbalgae_JavaJDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.xml.transform.Result;

public class J01_HelloJDBC {
	/**
	 * JDBC 데이터베이스에 접근하고 조작하는 것은 아주 중요한 주제중의 하나임 데이터베이스에는 여러 브랜드가 있음.Ex) Oracle,
	 * MySQL, MSSQL 등등 모든 데이터베이스 서버는 독점적인 방식을 통해 접근하고 관리하도록 허용 된다. 따라서, 각각의
	 * 데이터베이스에 접근하려면 각 브랜드가 제공하는 방식을 기술만을 사용해야 한다. 운좋게도 자바에서는 서로 다른 데이터베이스에 통일된
	 * 방식으로 접근하게 하는 JDBC를 제공함. Java7은 JDBC 4.1을 제공 JDBC Core API : java.sql 패키지
	 * JDBC Opetional API : javax.sql 패키지
	 * 
	 * JDBC Driver 데이터베이스 제조사가 제공하는 라이브러리 각 제조사는 자신만의 독점적인 기술을 이 라이브러리에 포함시켜 둠
	 * 이것을 JDBC API라는 통일된 코드를 이용해서 데이터베이스를 제어할 수 있음
	 * 
	 * 데이터베이스 접근 5단계 1. 데이터베이스에 접근하기 위해 JDBC드라이버 불러오기 2. 데이터베이스 연걸 얻기 3. 실행할 SQL
	 * 문장을 만들기 위해 Statement/PreparedStatement 객체 생성 4. SQL 문장을 실행하고 결과를 처리하기 위해
	 * ResultSet 객체를 생성 5. 모든 처리가 끝나면 JDBC 자원 해제
	 * 
	 * Oracle JDBC 드라이버 등록 ojdbc6.jar를 라이브러리로 등록 Build Path -> add external
	 * archives
	 * 
	 */
	public static void main(String[] args) throws SQLException {

		// 오라클 데이터베이스 연결정보
		final String DRV = "oracle.jdbc.driver.OracleDriver";
		final String URL = "jdbc:oracle:thin:@112.216.253.125:1521:xe";
		final String USR = "bbalgae";
		final String PWD = "bbalgae";

		// MySQL 데이터 베이스 연결정보
		// DRV = "com.mysql.jdbc.Driver"
		// URL = "jdbc:mysql://112.216.253.125:3306/zipcode"
		// USR = "zipcode";
		// PWD = "zipcode";

		// 데이터베이스 작업용 객체 정의
		Connection conn = null; // 연결
		PreparedStatement pstmt = null; // 질의
		ResultSet rs = null; // 결과
		String SQL = "select * from employees";

		// JDBC 관예련코드 작성시 예외처리를 위해 try - catch - finally 를 작성해둘 것!
		// 1. JDBC 드라이버 불러오기
		// Class : 클래스에 대한 객체를 동적으로 생성
		try {
			Class.forName(DRV);
			// 2. 데이터베이스 연결
			conn = DriverManager.getConnection(URL, USR, PWD);
			// 실행할 SQL질의 작성
			pstmt = conn.prepareStatement(SQL);
			// 4a. SQL 질의를 실행하고 결과를 받음
			rs = pstmt.executeQuery();
			// 4b. 받은결과 처리
			if (rs.next()) { // 결과에 데이터가 존재하면
				do { //계속 반복해서 그것을 처리
					System.out.print(rs.getString("employee_id"));
					System.out.println(rs.getString("department_id"));
					System.out.print(" / ");
					System.out.println(rs.getString(4));
				} while (rs.next());
			} else {// 결과에 데이터가 없으면
				//rs.getXxxx(): ResultSet 객체에서 데이터를 가져옴
				System.out.println("데이터가없다");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5. JDBC객체 해제 (역순으로 해제 Result->pstmt -> conn)

			if (rs != null)	try {rs.close();rs = null;}
			catch (Exception e) {};
			if (pstmt != null)
				try {
					pstmt.close();
					pstmt = null;
				} catch (Exception e) {
				}
			;
			if (conn != null)
				try {
					conn.close();
					conn = null;
				} catch (Exception e) {
				}
			;
		}

	}

}
